#ifndef JOUEUR_H_
#define JOUEUR_H_
#include <iostream>
#include "Map.h"
#include "Croco.h"
#include "Gazelle.h"
#include "Zebre.h"
#include "Elephant.h"
#include "Lion.h"

using namespace std;
#define NBPIONJOUEUR 15
#define NBGAZELLEJOUEUR 6
#define NBZEBREJOUEUR 5
#define NBELEPHANTJOUEUR 1
#define NBCROCODILEJOUEUR 2
#define NBLIONJOUEUR 1

class Joueur {

protected : string nom;
			int numero;
			int score;
			int nbPion ;
			bool inauguration;
			Pion *main[NBPIONJOUEUR];
			Map *map;

public:

	Joueur(string nomp,int n, Map *m) : nom(nomp), numero(n), map(m) {
		score = 0;
		nbPion = NBPIONJOUEUR;
		inauguration = false;

		int i = 0;
		while (i < NBGAZELLEJOUEUR){
			main[i] = new Gazelle(n);
			i++;
		}
		while (i < NBGAZELLEJOUEUR + NBZEBREJOUEUR){
			main[i] = new Zebre(n);
			i++;
		}
		while (i < NBGAZELLEJOUEUR + NBZEBREJOUEUR + NBELEPHANTJOUEUR ){
			main[i] = new Elephant(n);
			i++;
		}
		while (i < NBGAZELLEJOUEUR + NBZEBREJOUEUR + NBELEPHANTJOUEUR + NBCROCODILEJOUEUR ){
			main[i] = new Croco(n);
			i++;
		}
		while (i < NBPIONJOUEUR ){
			main[i] = new Lion(n);
			i++;
		}

	};

	virtual ~Joueur(){};
	virtual int jouer() = 0;
	void afficheMain();
	void supprimerPionMain(string nomPion);
	void ajouterPionMain(Pion* nomPion);
	int random(int binf, int bsup);

	int getNbPion() const {
		return nbPion;
	}

	bool isInauguration() const {
		return inauguration;
	}

	void setInauguration(bool inauguration) {
		this->inauguration = inauguration;
	}

	Map* getMap() {
		return map;
	}

	void retireGazelleJoueur();

	int getScore()  {
		return score;
	}

	void setScore(int score) {
		this->score = score;
	}

	const string& getNom() const {
		return nom;
	}

	 Pion** getMain()  {
		return main;
	}

	Pion* donnePion(int x){
		return main[x];
	}

	void setNbPion(int nbPion) {
		this->nbPion = nbPion;
	}

	void setNom(const string& nom) {
		this->nom = nom;
	}

	int getNumero() const {
		return numero;
	}

	void setNumero(int numero) {
		this->numero = numero;
	}

};

#endif /* JOUEUR_H_ */
